import {
	getStsAPI
} from "@/api/api/my.js"
import {
	getNowTime
} from "@/utils/utils.js"

import './hmac.js';
import './sha1.js';
import Crypto from './crypto.js';
import {
	Base64
} from './base64.js';


export default {
	data() {
		return {
			accessKeyId: '',
			accessKeySecret: '',
			timeout: '',
			ossMaxSize: ''
		}
	},
	methods: {
		mpUploadOssHelper(options) {
			this.accessKeyId = options.accessKeyId;
			this.accessKeySecret = options.accessKeySecret;
			// 限制参数的生效时间，单位为小时，默认值为1。
			this.timeout = options.timeout || 1;
			// 限制上传文件的大小，单位为MB，默认值为10。
			this.ossMaxSize = options.maxSize || 10;
		},
		createUploadParams() {
			const policy = this.getPolicyBase64();
			const signature = this.signature(policy);
			return {
				OSSAccessKeyId: this.accessKeyId,
				policy: policy,
				signature: signature,
			};
		},
		getPolicyBase64() {
			let date = new Date();
			// 设置policy过期时间。
			date.setHours(date.getHours() + this.timeout);
			let srcT = date.toISOString();
			const policyText = {
				expiration: srcT,
				conditions: [
					// 限制上传文件大小。
					["content-length-range", 0, this.ossMaxSize * 1024 * 1024],
				],
			};
			const buffer = Buffer.from(JSON.stringify(policyText));
			return buffer.toString("base64");
		},

		signature(policy) {
			var bytes = Crypto.HMAC(Crypto.SHA1, policy, this.accessKeySecret, {
				asBytes: true
			});

			return Crypto.util.bytesToBase64(bytes);
			// return Base64.stringify(
			// 	HmacSHA1(policy, this.accessKeySecret)
			// );
		},


		async initClient() {
			let value = uni.getStorageSync('ossConfig');
			//对比时间和缓存里面是否有值
			if (value && value.expiration > getNowTime()) {
				return value;
			} else {
				let [err, data] = await getStsAPI();
				this.mpUploadOssHelper({
					// 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户并授权。
					accessKeyId: data.accessKeyId,
					accessKeySecret: data.accessKeySecret,
				});
				// 生成参数。
				const params = this.createUploadParams();
				params.securityToken = data.securityToken;
				params.expiration = data.expiration;
				//保存oss配置参数
				uni.setStorage({
					key: 'ossConfig',
					data: params,
				});
				return params;
			}
		}
	},
	watch: {
		// 监听accept的变化，判断是否符合个平台要求
		// 只有微信小程序才支持选择媒体，文件类型，所以这里做一个判断提示
		accept: {
			immediate: true,
			handler(val) {
				// #ifndef MP-WEIXIN
				if (val === 'all' || val === 'media') {
					uni.$u.error('只有微信小程序才支持把accept配置为all、media之一')
				}
				// #endif
				// #ifndef H5 || MP-WEIXIN
				if (val === 'file') {
					uni.$u.error('只有微信小程序和H5(HX2.9.9)才支持把accept配置为file')
				}
				// #endif
			}
		},

	}
}
